package FunkcjePrzynaleznosci;

import PrzestrzenCiagla.PrzestrzenCiagla;

public class FNFSCFunkcjaPrzynaleznosci implements IFunkcjaPrzynaleznosci {

	private IFunkcjaPrzynaleznosci funkcjaPrzynaleznosci;
	private float przesuniecie;
	private float koniecZakresu;
	private float poczatekZakresu;
	
	public FNFSCFunkcjaPrzynaleznosci(IFunkcjaPrzynaleznosci funkcjaPrzynaleznosci, float przesuniecie, PrzestrzenCiagla przestrzen) {
		super();
		this.funkcjaPrzynaleznosci = funkcjaPrzynaleznosci;
		this.przesuniecie = przesuniecie;
		this.koniecZakresu = znajdzNowyKoniecZakresu(funkcjaPrzynaleznosci, przesuniecie, przestrzen);
		this.poczatekZakresu = znajdzNowyPoczatekZakresu(funkcjaPrzynaleznosci, przesuniecie, przestrzen);
		
	}
	
	private static float znajdzNowyKoniecZakresu(IFunkcjaPrzynaleznosci funkcjaPrzynaleznosci, float przesuniecie, PrzestrzenCiagla przestrzen){
		for(float x = funkcjaPrzynaleznosci.getKoniecZakresu(); x <= przestrzen.getKoniec(); x+=przestrzen.getKrok()){
			if(getWartosc(x, funkcjaPrzynaleznosci, przesuniecie) == 0f){
				return x;
			}
		}
		return przestrzen.getKoniec();
	}
	
	private static float znajdzNowyPoczatekZakresu(IFunkcjaPrzynaleznosci funkcjaPrzynaleznosci, float przesuniecie, PrzestrzenCiagla przestrzen){
		for(float x = funkcjaPrzynaleznosci.getPoczatekZakresu(); x >= przestrzen.getPoczatek(); x-=przestrzen.getKrok()){
			if(getWartosc(x, funkcjaPrzynaleznosci, przesuniecie) == 0f){
				return x;
			}
		}
		return przestrzen.getPoczatek();
	}
	
	private static float getWartosc(float x, IFunkcjaPrzynaleznosci funkcjaPrzynaleznosci, float przesuniecie){
		float wartosc = funkcjaPrzynaleznosci.getWartosc(x) + przesuniecie;
		if(wartosc > 1f){
			return 1f;
		}
		
		return wartosc;
	}

	@Override
	public float getKoniecZakresu() {
		return this.koniecZakresu;
	}

	@Override
	public float getPoczatekZakresu() {
		return this.poczatekZakresu;
	}

	@Override
	public float getSrodek() {
		return this.funkcjaPrzynaleznosci.getSrodek();
	}

	@Override
	public String getTyp() {
		return IFunkcjaPrzynaleznosci.FNFSC;
	}

	@Override
	public float getWartosc(float x) {
		float wartosc = funkcjaPrzynaleznosci.getWartosc(x) + przesuniecie;
		if(wartosc > 1f){
			return 1f;
		}
		if(wartosc < 0f){
			return 0f;
		}
		
		return wartosc;
	}
	
	@Override
	public boolean czyOstra(){
		return true;
	}
	


	
	
}
